#ifndef __M_LOGGER_HPP
#define __M_LOGGER_HPP

#include <stdio.h>
#include <time.h>

#define NOR 0
#define DBG 1
#define ERR 2

#define DEFAULT_LOG_LEVEL DBG

// 由下面的if判断可看出，NOR级别的日志并不会被打出，那为什么还要设置呢？
// 为了代码的灵活性，可以在不同开发阶段或不同环境通过修改DEFAULT_LOG_LEVEL的值来启用或禁用不同级别的日志
// 如果我要调式，那么我就修改为NOR，就可以输出所有级别的日志了，可以无缝切换

#define LOG(level, format, ...)                                                                   \
    do                                                                                            \
    {                                                                                             \
        if (level >= DEFAULT_LOG_LEVEL)                                                           \
        {                                                                                         \
            time_t t = time(NULL);                                                                \
            struct tm *lt = localtime(&t);                                                        \
            char buffer[32] = {0};                                                                \
            strftime(buffer, sizeof(buffer) - 1, "%H:%M:%S", lt);                                 \
            fprintf(stdout, "[%s %s %d]" format "\n", buffer, __FILE__, __LINE__, ##__VA_ARGS__); \
        }                                                                                         \
    } while (0)


#define NLOG(format, ...) LOG(NOR, format, ##__VA_ARGS__)
#define DLOG(format, ...) LOG(DBG, format, ##__VA_ARGS__)
#define ELOG(format, ...) LOG(ERR, format, ##__VA_ARGS__)

#endif